package com.cnswhy.cloud.server.core.dto;


import java.beans.Transient;
import java.io.Serializable;
import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import cn.hutool.core.collection.CollUtil;

/**
 * 描述: 购物车
 * 版权: Copyright (c) 2019
 * 公司: 小鹿科技
 * 作者: 张润泽
 * 版本: 1.0
 * 创建日期: 2019年8月27日
 * 创建时间: 下午3:24:33
 */
public class BuyerCart implements Serializable
{

    private static final long serialVersionUID = 1L;

    /**
     * 商家列表
     */
    private List<BuyerMerchant> merchants = new ArrayList<BuyerMerchant>();

    /**
     * 总金额
     */
    @SuppressWarnings("unused")
    private BigDecimal totalPrice;

    /**
     * 客户id（生成订单时使用）
     */
    private Long customerId;

    /**
     * 总数量
     */
    @SuppressWarnings("unused")
    private Integer totalNum;

    /**
     * 描述：计算总金额
     * 作者：张润泽
     * 时间：2019年8月30日 上午10:29:53
     * @return
     */
    public BigDecimal getTotalPrice()
    {
        BigDecimal result = BigDecimal.ZERO;
        for (BuyerMerchant merchant : merchants)
        {
            if (merchant.getSubtotal() != null)
            {
                result = result.add(merchant.getSubtotal().add(merchant.getSubFreightPrice()));
            }
        }
        return result;
    }

    public void setTotalPrice(BigDecimal totalPrice)
    {
        this.totalPrice = totalPrice;
    }

    public void setTotalNum(Integer totalNum)
    {
        this.totalNum = totalNum;
    }

    /**
     * 描述：计算商品总数量
     * 作者：张润泽
     * 时间：2019年8月30日 上午10:29:58
     * @return
     */
    public Integer getTotalNum()
    {
        Integer result = 0;
        for (BuyerMerchant merchant : merchants)
        {
            List<BuyerItem> items = merchant.getItems();
            for (BuyerItem item : items)
            {
                result += item.getNum();
            }
        }
        return result;
    }

    /**
     * 描述：添加商户到购物车
     * 作者：张润泽
     * 时间：2019年8月27日 下午6:22:09
     * @param item
     */
    @Transient
    public void addMerchant(BuyerMerchant merchant)
    {
        boolean flag = false;
        for (BuyerMerchant buyerMerchant : merchants)
        {
            if (buyerMerchant.getMerchantId().equals(merchant.getMerchantId()))
            {
                buyerMerchant.addItem(merchant.getItems());
                flag = true;
                break;
            }
        }

        if (!flag)
        {
            merchants.add(merchant);
        }
    }

    /**
     * 描述：添加商户到购物车
     * 作者：张润泽
     * 时间：2019年8月27日 下午6:22:09
     * @param item
     */
    @Transient
    public void addMerchant(List<BuyerMerchant> merchantList)
    {
        for (BuyerMerchant merchant : merchantList)
        {
            boolean flag = false;
            for (BuyerMerchant buyerMerchant : merchants)
            {
                if (buyerMerchant.getMerchantId().equals(merchant.getMerchantId()))
                {
                    buyerMerchant.addItem(merchant.getItems());
                    flag = true;
                    break;
                }
            }

            if (!flag)
            {
                merchants.add(merchant);
            }
        }
    }

    /**
     * 描述：删除购物项
     * 作者：张润泽
     * 时间：2019年8月27日 下午8:35:11
     */
    @Transient
    public void deleteItem(BuyerOperateBo bo)
    {
        for (BuyerMerchant merchant : merchants)
        {
            if (merchant.getMerchantId().equals(bo.getMerchantId()))
            {
                List<BuyerItem> items = merchant.getItems();
                Iterator<BuyerItem> iterator = items.iterator();
                while (iterator.hasNext())
                {
                    BuyerItem item = iterator.next();
                    if (item.getSku().getStockId().equals(bo.getStockId()))
                    {
                        if (bo.getNum() != null && bo.getNum() > 0)
                        {
                            if (item.getNum() > bo.getNum())
                            {
                                item.setNum(item.getNum() - bo.getNum());
                            }
                            else
                            {
                                iterator.remove();
                            }
                        }
                        else
                        {
                            iterator.remove();
                        }
                        break;
                    }
                }
            }

            // 商户下无购物项，清除商户
            if (CollUtil.isEmpty(merchant.getItems()))
            {
                merchants.remove(merchant);
            }
        }
    }

    /**
     * 描述：删除购物项
     * 作者：张润泽
     * 时间：2019年8月27日 下午8:35:11
     */
    public void deleteItem(List<BuyerOperateBo> list)
    {
        for (BuyerOperateBo bo : list)
        {
            Iterator<BuyerMerchant> merchantIterator = merchants.iterator();
            while (merchantIterator.hasNext())
            {
                BuyerMerchant merchant = merchantIterator.next();
                if (merchant.getMerchantId().equals(bo.getMerchantId()))
                {
                    List<BuyerItem> items = merchant.getItems();
                    Iterator<BuyerItem> iterator = items.iterator();
                    while (iterator.hasNext())
                    {
                        BuyerItem item = iterator.next();
                        if (item.getSku().getStockId().equals(bo.getStockId()))
                        {
                            if (bo.getNum() != null && bo.getNum() > 0)
                            {
                                if (item.getNum() > bo.getNum())
                                {
                                    item.setNum(item.getNum() - bo.getNum());
                                }
                                else
                                {
                                    iterator.remove();
                                }
                            }
                            else
                            {
                                iterator.remove();
                            }
                            break;
                        }
                    }
                }

                // 商户下无购物项，清除商户
                if (CollUtil.isEmpty(merchant.getItems()))
                {
                    merchantIterator.remove();
                }
            }
        }
    }

    public List<BuyerMerchant> getMerchants()
    {
        return merchants;
    }

    public void setMerchants(List<BuyerMerchant> merchants)
    {
        this.merchants = merchants;
    }

    public Long getCustomerId()
    {
        return customerId;
    }

    public void setCustomerId(Long customerId)
    {
        this.customerId = customerId;
    }

}
